package com.xhu.base;

/**
 * 针对数据库中列名的隐藏
 * @author 王涛
 * @Created by WT on 2019/3/25.
 */
public class NameHide {

    /**
     * 这个函数的作用是将明文的列名加密为密文下的列名
     * @param name  明文下的列名
     * @return  返回加密后的密文列名
     * @throws Exception
     */
    public static String getSecretName(String name) throws Exception{
        return EncryptAlgorithm(name);
    }

    /**
     * 这个函数的作用是将密文下的列名解密成明文的列名<br>
     * 在数据库中的列名是以"secretTableName_type",其中的type是指：DET、OPE、JOIN、SEARCH或者HOM
     * @param secretNameWithType  带有加密类型的密文列名
     * @return  明文的列名
     * @throws Exception
     */
    public static String getPlainName(String secretNameWithType) throws Exception{
        String[] temp = secretNameWithType.split("_");
        return new String(DecryptAlgorithm(temp[0]));
    }
    /**
     * 经过String getSecretTableName(String tableName)函数的处理之后，还要用这些函数
     * 以telephone为例，经过这个函数的处理之后，得到的是dGVsZXBob25l，我们还需要使用后面几个getXXXTableName来改写为
     * dGVsZXBob25l_DET、dGVsZXBob25l_OPE等形式、并以这种形式存放在数据库中
     * @param secretName
     * @return
     */
    public static String getDETName(String secretName){
        return secretName+"_DET";
    }
    public static String getOPEName(String secretName){
        return secretName+"_OPE";
    }
    public static String getJOINName(String secretName){
        return secretName+"_JOIN";
    }
    public static String getHOMName(String secretName){
        return secretName+"_HOM";
    }
    public static String getSEARCHName(String secretName){
        return secretName+"_SEARCH";
    }

    /**
     * 得到加密后的列名
     * @param str 列名
     * @return
     */
    private static String EncryptAlgorithm(String str){
        StringBuffer strBuffer = new StringBuffer(str).reverse();
        return strBuffer.toString();
    }

    /**
     * 得到解密后的密文
     * @param str 列名
     * @return
     */
    private static String DecryptAlgorithm(String str){
        StringBuffer strBuffer = new StringBuffer(str).reverse();
        return strBuffer.toString();
    }

    public static void main(String[] args) throws Exception {
        String secretName = getSecretName("telephone");
        System.out.println("密文的列名："+secretName);

        String secretNameWithDET = getDETName(secretName);
        System.out.println("DET列的名字："+secretNameWithDET);

        String secretNameWithOPE = getOPEName(secretName);
        System.out.println("OPE列的名字："+secretNameWithOPE);

        String secretNameWithJOIN = getJOINName(secretName);
        System.out.println("JOIN列的名字："+secretNameWithJOIN);

        String plainName = getPlainName(secretNameWithJOIN);
        System.out.println("明文列名是："+plainName);
        System.out.println("列名加密模块测试完成");
    }
}
